home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / uip / other / newssend.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-07-23  |  4.6 KB  |  226 lines

  1. /*
  2.  *    A program modelled after resend to feed news articles into
  3.  *    the Internet Mail system.
  4.  */
  5.  
  6. #include "util.h"                 /* to get mmdf reply codes            */
  7. #include "mmdf.h"                 /* to get mmdf reply codes            */
  8. #include "cnvtdate.h"
  9. #include <signal.h>
  10. #include <sys/stat.h>
  11.  
  12. extern char     *locname;
  13. extern char     *locdomain;
  14.  
  15. char    *logdir;
  16. char    *strdup();
  17.  
  18. char    noret;                    /* no return address                  */
  19. char    watchit;                  /* user wants to watch delivery       */
  20. int    hadto;
  21.  
  22. #define FRMNONE 0                 /* no From field specified            */
  23. #define FRMTXT  1                 /* From field had text only           */
  24. #define FRMSNDR 2                 /* field had sender info, too         */
  25.  
  26.  
  27. char *byebyelines[] = {
  28.     "resent",
  29.     "reply-to",
  30.     "arpa-address",
  31.     "status",
  32.     "article-i.d.",
  33.     "article-id",
  34.     "in-reply-to",
  35.     "relay-version",
  36.     "posting-version",
  37.     "date-received",
  38.     "distribution",
  39.     "reference",
  40.     "summary",
  41.     "path",
  42.     "organization",
  43.     "lines",
  44.     0
  45. };
  46. /*  **************************  MAIN  ******************************* */
  47.  
  48. main (argc, argv)
  49. int     argc;
  50. char   *argv[];
  51. {
  52.     mmdf_init (argv[0]);
  53.     pgminit ();
  54.  
  55.     sendmail (argc, argv);
  56. }
  57.  
  58. pipsig ()
  59. {
  60.     if (rp_gval (endchild (NOTOK)) == RP_NO)
  61.         err_abrt(RP_LIO, "Abnormal return from submit\n");
  62.     exit (NOTOK);
  63. }
  64.  
  65. pgminit ()
  66. {
  67.     int     realid,
  68.     effecid;
  69.  
  70.     signal (SIGPIPE, pipsig);    /* catch write to bad pipe            */
  71.  
  72.     getwho (&realid, &effecid);   /* who am i?                          */
  73.     if (setuid(effecid) < 0)    /* Need to be MMDF */
  74.         err_abrt (RP_LIO, "Unable to setuid to effecid");
  75. }
  76. /*^L*/
  77.  
  78. char *newschannel = "smtp";
  79. char regargs[100] = "qrmthUSENET*";
  80. /* quick NS timeout, do not return on error, return to sender, mail, trustme */
  81.  
  82. sendmail (argc, argv)             /* Send a message                     */
  83. int     argc;
  84. char   *argv[];
  85. {
  86.     char    *replyto;
  87.     int     retval;
  88.     int    i;
  89.  
  90.     if (rp_isbad (mm_init ()) || rp_isbad (mm_sbinit ()))
  91.         err_abrt (RP_MECH, "Unable to submit mail; please report this error");
  92.  
  93.     if (lexequ("-r", argv[1])) {
  94.         replyto = argv[2];
  95.         argc -= 2;
  96.         argv += 2;
  97.     } else
  98.         replyto = (char *)0;
  99.  
  100.     if (argc < 3)
  101.         err_abrt (RP_MECH, "Usage:  newssend [-r replyto] faketo realto ...");
  102.  
  103.     if (rp_isbad (mm_winit (newschannel, regargs, replyto)))
  104.         err_abrt (RP_MECH, "problem with submit message initialization");
  105.     for (i = 2; i < argc; i++)
  106.         if (rp_isbad(mm_wadr((char *)0, argv[i])))
  107.             err_abrt (RP_MECH, "problem submitting address %s", argv[i]);
  108.     mm_waend();
  109.  
  110.     dumpheader();
  111.     sndhdr("To:", argv[1]);
  112.     mm_wtxt("\n", 1);
  113.  
  114.     dobody ();
  115.     retval = endbody ();
  116.  
  117.     endchild (OK);
  118.  
  119.     exit ((rp_isbad (retval)) ? NOTOK : OK);
  120. }
  121. /*   *************  ARGUMENT PARSING FOR SENDMAIL  **************  */
  122.  
  123. dumpheader()
  124. {
  125.     char    line[LINESIZE];
  126.     int    found;
  127.  
  128.     found = 0;
  129.     while (fgets (line, LINESIZE, stdin) != NULL) {
  130.         register int j;
  131.  
  132.         if (line[0] == '\n')
  133.             break;
  134.         if (isspace(line[0]) && found)
  135.             continue;
  136.         found = 0;
  137.         for (j = 0; byebyelines[j] != NULL; j++) {
  138.             if (prefix(byebyelines[j], line)) {
  139.                 ++found;
  140.                 break;
  141.             }
  142.         }
  143.         if (found)
  144.             continue;
  145.         found = 0;
  146.         mm_wtxt (line, strlen (line));
  147.     }
  148. }
  149.  
  150. sndhdr (name, contents)
  151. char    name[],
  152. contents[];
  153. {
  154.     char    linebuf[LINESIZE];
  155.  
  156.     sprintf (linebuf, "%-10s%s\n", name, contents);
  157.     mm_wtxt (linebuf, strlen (linebuf));
  158. }
  159.  
  160. /* */
  161.  
  162. dobody ()
  163. {
  164.     char    buffer[BUFSIZ];
  165.     register int    i;
  166.  
  167.     while (!feof (stdin) && !ferror (stdin) &&
  168.         (i = fread (buffer, sizeof (char), sizeof (buffer), stdin)) > 0)
  169.         if (rp_isbad (i = mm_wtxt (buffer, i)))
  170.             err_abrt (i, "Problem writing body");
  171.  
  172.     if (ferror (stdin))
  173.         err_abrt (RP_FIO, "Problem reading body");
  174. }
  175.  
  176. endbody ()
  177. {
  178.     struct rp_bufstruct thereply;
  179.     int     len;
  180.  
  181.     if (rp_isbad (mm_wtend ()))
  182.         err_abrt (RP_MECH, "problem ending submission");
  183.  
  184.     if (rp_isbad (mm_rrply (&thereply, &len)))
  185.         err_abrt (RP_MECH, "problem getting submission status");
  186.  
  187.     if (rp_isbad (thereply.rp_val))
  188.         err_abrt (thereply.rp_val, thereply.rp_line);
  189.  
  190.     return (thereply.rp_val);
  191. }
  192.  
  193. /*  *********************  UTILITIES  ***************************  */
  194.  
  195. endchild (type)
  196. int     type;
  197. {
  198.     int retval;
  199.  
  200.  
  201.     if (rp_isgood (retval = mm_sbend ()))
  202.         retval = mm_end (type);
  203.  
  204.     return ((retval == NOTOK) ? RP_FIO : (retval >> 8));
  205. }
  206.  
  207. /* VARARGS2 */
  208.  
  209. err_abrt (code, fmt, b, c, d)     /* terminate the process              */
  210. int     code;                     /* a mmdfrply.h termination code      */
  211. char   *fmt,
  212. *b,
  213. *c,
  214. *d;
  215. {
  216.     if (fmt) {
  217.         printf (fmt, b, c, d);
  218.         printf (" [%s]", rp_valstr (code));
  219.         putchar ('\n');
  220.     }
  221.     printf ("Message posting aborted\n");
  222.     fflush (stdout);
  223.     endchild (NOTOK);
  224.     exit (NOTOK);
  225. }
  226.